package cn.xiaoniu.day03;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;

import cn.xiaoniu.day03.bean.AddrList;
import cn.xiaoniu.day03.bean.BikeBean;
import cn.xiaoniu.day03.bean.RetBean;
import cn.xiaoniu.day03.utils.Utils;

/**
 * 
 * @author root
 *
 */
public class TestMain {
	//静态加载文件，减少文件读取
	static Map<String, String> map = null;
	static{
		try {
			map = loadData();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new FileReader("d:\\data\\bikes.log"));){
			String line = null;
			while((line=br.readLine())!=null){
				BikeBean bean = JSON.parseObject(line, BikeBean.class);
				//获取经纬度信息
				double latitude = bean.getLatitude();
				double longitude = bean.getLongitude();
				//System.out.println(latitude+" "+longitude);
				//查找
				String addr = findAddr(latitude,longitude);
				//System.out.println(addr);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
	/**
	 * 查找位置信息
	 * 	1：本地查找
	 * 	2：外网查找
	 * @param latitude
	 * @param longitude
	 * @return
	 */
	private static String findAddr(double latitude, double longitude) {
		//本地查找数据
		String addr = findAddrByLocal(latitude,longitude);
		if(addr == null){//本地没有找到
			addr = findAddrByNet(latitude,longitude);
			System.err.println(addr);
		}else{
			System.out.println(addr);
		}
		return addr;
	}


	/**
	 * 从网络中查找
	 * 1：从网络中查找数据（json数据）
	 * 2：数据解析
	 * @param latitude
	 * @param longitude
	 * @return
	 */
	private static String findAddrByNet(double latitude, double longitude) {
		//得到geohash值
		String geoHash = Utils.getGeoHash(latitude, longitude);
		//得到从网络中的返回结果
		String jsonByNet = Utils.getJsonByNet(latitude, longitude);
		RetBean retBean = JSON.parseObject(jsonByNet, RetBean.class);
		AddrList addrList = retBean.getAddrList()[0];
		String admName = addrList.getAdmName();
		String[] split = admName.split(",");
		if(split.length>2){
			String province = split[0];
			String city = split[1];
			String district = split[2];
			String ret  = geoHash+"\t"+province+"\t"+city+"\t"+district+"\t"+addrList.getName();
			//做一个流，写入到本地仓库（不能覆盖，追加）       注意：及时更新map数据 1：再读一次文件，   2：放map中一份
			
			return ret;
		}
		
		return null;
	}



	/**
	 * 从本地查找
	 * @param latitude
	 * @param longitude
	 * @return
	 */
	private static String findAddrByLocal(double latitude, double longitude) {
		String geoHash = Utils.getGeoHash(latitude, longitude);//参数写的见名知意
		String ret = map.get(geoHash);
		return ret;
	}



	/**
	 * 加载数据到内存中   map<hash,line>
	 */
	public static Map<String, String> loadData() throws Exception{
		Map<String, String> map = new HashMap<>();
		try (BufferedReader br = new BufferedReader(new FileReader("D:\\data\\repostory.txt"));){
			String line = null;
			while((line = br.readLine())!=null){
				String[] split = line.split("\t");
				String geohash = split[0];
				map.put(geohash, line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

}
